////////////////////////////////////////////////////////////////////////////////
/*! \file
 * \brief Windows implementation file for the library-object.
 *
 * \author Ivo Wingelaar
 * \date 2011
 * \version 0.1.1
 * \copyright GNU Lesser General Public License v3
 */
////////////////////////////////////////////////////////////////////////////////

#include "MythDynamic_LibraryWindows_C.hpp"

#ifdef _MYTH_WINDOWS_

namespace Myth
{
namespace Dynamic
{

////////////////////////////////////////////////////////////////////////////////
//! Default constructor.
LibraryWindows_C::LibraryWindows_C(void)
{
    mLibrary = GetModuleHandle(0);
}

////////////////////////////////////////////////////////////////////////////////
//! Constructor.
LibraryWindows_C::LibraryWindows_C(const std::string& name)
{
    mLibrary = LoadLibrary(name.c_str());
}

////////////////////////////////////////////////////////////////////////////////
//! Virtual destructor.
LibraryWindows_C::~LibraryWindows_C(void)
{
    if(mLibrary != NULL)
        FreeLibrary(mLibrary);
}

////////////////////////////////////////////////////////////////////////////////
//! Searches for the specified symbol and returns it if found.
void* LibraryWindows_C::get_symbol(const std::string& symbol_name, std::string* error_message)
{
    if(mLibrary != NULL)
        return (void*)GetProcAddress(mLibrary, symbol_name.c_str());
    else
        return NULL;
}

////////////////////////////////////////////////////////////////////////////////
//! Returns if the library was loaded succesfuly.
bool LibraryWindows_C::is_valid(void) const
{
    return (mLibrary != NULL);
}

////////////////////////////////////////////////////////////////////////////////
//! Returns the system-specific error message.
std::string LibraryWindows_C::get_error(void) const
{
    return mError;
}

} // namespace Dynamic
} // namespace Myth

#endif // _MYTH_WINDOWS_
